/**
 * 链表翻转。给出一个链表和一个数k，
 * 比如链表1→2→3→4→5→6，
 * 若k=2，则翻转后 2→1→4→3→6→5，
 * 若k=3,翻转后3→2→1→6→5→4，
 * 若k=4，翻转后4→3→2→1→5→6，用程 序实现。可以用任何语言实现。 
 */
function reverse(linktab, k = 0) {
    if (k < 2 || !linktab || !linktab.next) {
        return linktab;
    } else {
        let newlink = linktab;//定义新的链表，并把就链表第一个元素移过去；
        let nexlinkLast = linktab//标记新链表的尾部元素；
        linktab = linktab.next;//旧链表，转移第一个元素后，第二个元素为旧链表头；

        //游标index，判断是否多于k个的元素；
        let index = 1;
        let tempitem = linktab
        while (index < k && tempitem) {
            tempitem = tempitem.next;
            index++;
        }
        if (index == k) {
            //>=k
            index=1;
            while (index < k && linktab) {
                //翻转k个元素
                let temp = linktab.next;
                linktab.next = newlink;
                newlink = linktab;
                linktab = temp;
                index++;
            }
            //递归k之后的元素，并放在新链表的尾部
            nexlinkLast.next = reverse(linktab, k);
            return newlink;
        } else {           
            return newlink
        }
    }
}
var link = {
    value: 1,
    next: {
        value: 2,
        next: {
            value: 3,
            next: {
                value: 4,
                next: {
                    value: 5,
                    next: {
                        value: 6
                    }
                }
            }
        }
    }
}
console.log(JSON.stringify(reverse(link, 5)));

